package base

import (
	"jlpay-sdk-go/pkg/jlpay/core"
	"jlpay-sdk-go/pkg/jlpay/models"
)

// ==================== 银行总行信息查询 ====================

// BankListRequest 银行总行信息查询请求
type BankListRequest struct {
	models.OrgBaseRequest
	// BankName 银行名称
	BankName string `json:"bank_name,omitempty"`
	// BankCode 银行行号
	BankCode string `json:"bank_code,omitempty"`
	// Limit 每页记录数
	Limit int `json:"limit,omitempty"`
	// Offset 偏移量
	Offset int `json:"offset,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewBankListRequest 创建银行总行信息查询请求
func NewBankListRequest() *BankListRequest {
	req := &BankListRequest{}
	return req
}

// SetBankName 设置银行名称
func (r *BankListRequest) SetBankName(bankName string) *BankListRequest {
	r.BankName = bankName
	return r
}

// SetBankCode 设置银行行号
func (r *BankListRequest) SetBankCode(bankCode string) *BankListRequest {
	r.BankCode = bankCode
	return r
}

// SetLimit 设置每页记录数
func (r *BankListRequest) SetLimit(limit int) *BankListRequest {
	r.Limit = limit
	return r
}

// SetOffset 设置偏移量
func (r *BankListRequest) SetOffset(offset int) *BankListRequest {
	r.Offset = offset
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *BankListRequest) SetRawRequestMap(rawMap map[string]interface{}) *BankListRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *BankListRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *BankListRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.BankName != "" {
		baseMap["bank_name"] = r.BankName
	}
	if r.BankCode != "" {
		baseMap["bank_code"] = r.BankCode
	}
	if r.Limit > 0 {
		baseMap["limit"] = r.Limit
	}
	if r.Offset > 0 {
		baseMap["offset"] = r.Offset
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *BankListRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// BankListResponse 银行总行信息查询响应
type BankListResponse struct {
	models.StandardResponse
	// 银行列表
	BankList []*BankInfo `json:"bank_list,omitempty"`
	// 总记录数
	Total int `json:"total,omitempty"`
}

// BankInfo 银行信息
type BankInfo struct {
	// BankCode 银行行号
	BankCode string `json:"bank_code,omitempty"`
	// BankName 银行名称
	BankName string `json:"bank_name,omitempty"`
	// BankType 银行类型
	BankType string `json:"bank_type,omitempty"`
}

// ==================== 分支行信息查询 ====================

// BankBranchListRequest 分支行信息查询请求
type BankBranchListRequest struct {
	models.OrgBaseRequest
	// BranchName 分支行名称
	BranchName string `json:"branch_name,omitempty"`
	// BankCode 银行行号
	BankCode string `json:"bank_code,omitempty"`
	// Limit 每页记录数
	Limit int `json:"limit,omitempty"`
	// Offset 偏移量
	Offset int `json:"offset,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewBankBranchListRequest 创建分支行信息查询请求
func NewBankBranchListRequest() *BankBranchListRequest {
	req := &BankBranchListRequest{}
	return req
}

// SetBranchName 设置分支行名称
func (r *BankBranchListRequest) SetBranchName(branchName string) *BankBranchListRequest {
	r.BranchName = branchName
	return r
}

// SetBankCode 设置银行行号
func (r *BankBranchListRequest) SetBankCode(bankCode string) *BankBranchListRequest {
	r.BankCode = bankCode
	return r
}

// SetLimit 设置每页记录数
func (r *BankBranchListRequest) SetLimit(limit int) *BankBranchListRequest {
	r.Limit = limit
	return r
}

// SetOffset 设置偏移量
func (r *BankBranchListRequest) SetOffset(offset int) *BankBranchListRequest {
	r.Offset = offset
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *BankBranchListRequest) SetRawRequestMap(rawMap map[string]interface{}) *BankBranchListRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *BankBranchListRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *BankBranchListRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.BranchName != "" {
		baseMap["branch_name"] = r.BranchName
	}
	if r.BankCode != "" {
		baseMap["bank_code"] = r.BankCode
	}
	if r.Limit > 0 {
		baseMap["limit"] = r.Limit
	}
	if r.Offset > 0 {
		baseMap["offset"] = r.Offset
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *BankBranchListRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// BankBranchListResponse 分支行信息查询响应
type BankBranchListResponse struct {
	models.StandardResponse
	// 分支行列表
	BranchList []*BankBranchInfo `json:"branch_list,omitempty"`
	// 总记录数
	Total int `json:"total,omitempty"`
}

// BankBranchInfo 分支行信息
type BankBranchInfo struct {
	// BranchCode 分支行行号
	BranchCode string `json:"branch_code,omitempty"`
	// BranchName 分支行名称
	BranchName string `json:"branch_name,omitempty"`
	// BankCode 银行行号
	BankCode string `json:"bank_code,omitempty"`
	// BankName 银行名称
	BankName string `json:"bank_name,omitempty"`
	// Province 省份
	Province string `json:"province,omitempty"`
	// City 城市
	City string `json:"city,omitempty"`
}

// ==================== MCC信息查询 ====================

// MccQueryRequest MCC信息查询请求
type MccQueryRequest struct {
	models.OrgBaseRequest
	// MccCode MCC码
	MccCode string `json:"mcc_code,omitempty"`
	// Limit 每页记录数
	Limit int `json:"limit,omitempty"`
	// Offset 偏移量
	Offset int `json:"offset,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewMccQueryRequest 创建MCC信息查询请求
func NewMccQueryRequest() *MccQueryRequest {
	req := &MccQueryRequest{}
	return req
}

// SetMccCode 设置MCC码
func (r *MccQueryRequest) SetMccCode(mccCode string) *MccQueryRequest {
	r.MccCode = mccCode
	return r
}

// SetLimit 设置每页记录数
func (r *MccQueryRequest) SetLimit(limit int) *MccQueryRequest {
	r.Limit = limit
	return r
}

// SetOffset 设置偏移量
func (r *MccQueryRequest) SetOffset(offset int) *MccQueryRequest {
	r.Offset = offset
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *MccQueryRequest) SetRawRequestMap(rawMap map[string]interface{}) *MccQueryRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *MccQueryRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *MccQueryRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.MccCode != "" {
		baseMap["mcc_code"] = r.MccCode
	}
	if r.Limit > 0 {
		baseMap["limit"] = r.Limit
	}
	if r.Offset > 0 {
		baseMap["offset"] = r.Offset
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *MccQueryRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// MccQueryResponse MCC信息查询响应
type MccQueryResponse struct {
	models.StandardResponse
	// MCC列表
	MccList []*MccInfo `json:"mcc_list,omitempty"`
	// 总记录数
	Total int `json:"total,omitempty"`
}

// MccInfo MCC信息
type MccInfo struct {
	// MccCode MCC码
	MccCode string `json:"mcc_code,omitempty"`
	// MccName MCC名称
	MccName string `json:"mcc_name,omitempty"`
	// MccType MCC类型
	MccType string `json:"mcc_type,omitempty"`
}

// ==================== 地区码信息查询 ====================

// RegionListRequest 地区码信息查询请求
type RegionListRequest struct {
	models.OrgBaseRequest
	// RegionName 地区名称
	RegionName string `json:"region_name,omitempty"`
	// RegionRank 地区等级
	RegionRank string `json:"region_rank,omitempty"`
	// Limit 每页记录数
	Limit int `json:"limit,omitempty"`
	// Offset 偏移量
	Offset int `json:"offset,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewRegionListRequest 创建地区码信息查询请求
func NewRegionListRequest() *RegionListRequest {
	req := &RegionListRequest{}
	return req
}

// SetRegionName 设置地区名称
func (r *RegionListRequest) SetRegionName(regionName string) *RegionListRequest {
	r.RegionName = regionName
	return r
}

// SetRegionRank 设置地区等级
func (r *RegionListRequest) SetRegionRank(regionRank string) *RegionListRequest {
	r.RegionRank = regionRank
	return r
}

// SetLimit 设置每页记录数
func (r *RegionListRequest) SetLimit(limit int) *RegionListRequest {
	r.Limit = limit
	return r
}

// SetOffset 设置偏移量
func (r *RegionListRequest) SetOffset(offset int) *RegionListRequest {
	r.Offset = offset
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *RegionListRequest) SetRawRequestMap(rawMap map[string]interface{}) *RegionListRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *RegionListRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *RegionListRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.RegionName != "" {
		baseMap["region_name"] = r.RegionName
	}
	if r.RegionRank != "" {
		baseMap["region_rank"] = r.RegionRank
	}
	if r.Limit > 0 {
		baseMap["limit"] = r.Limit
	}
	if r.Offset > 0 {
		baseMap["offset"] = r.Offset
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *RegionListRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// RegionListResponse 地区码信息查询响应
type RegionListResponse struct {
	models.StandardResponse
	// 地区列表
	RegionList []*RegionInfo `json:"region_list,omitempty"`
	// 总记录数
	Total int `json:"total,omitempty"`
}

// RegionInfo 地区信息
type RegionInfo struct {
	// RegionCode 地区码
	RegionCode string `json:"region_code,omitempty"`
	// RegionName 地区名称
	RegionName string `json:"region_name,omitempty"`
	// RegionRank 地区等级
	RegionRank string `json:"region_rank,omitempty"`
	// ParentCode 父级地区码
	ParentCode string `json:"parent_code,omitempty"`
}

// ==================== 银行卡bin信息查询 ====================

// BankCardBinMatchingRequest 银行卡bin信息查询请求
type BankCardBinMatchingRequest struct {
	models.OrgBaseRequest
	// CardNo 银行卡号
	CardNo string `json:"card_no,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewBankCardBinMatchingRequest 创建银行卡bin信息查询请求
func NewBankCardBinMatchingRequest() *BankCardBinMatchingRequest {
	req := &BankCardBinMatchingRequest{}
	return req
}

// SetCardNo 设置银行卡号
func (r *BankCardBinMatchingRequest) SetCardNo(cardNo string) *BankCardBinMatchingRequest {
	r.CardNo = cardNo
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *BankCardBinMatchingRequest) SetRawRequestMap(rawMap map[string]interface{}) *BankCardBinMatchingRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *BankCardBinMatchingRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *BankCardBinMatchingRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.CardNo != "" {
		baseMap["card_no"] = r.CardNo
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *BankCardBinMatchingRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// BankCardBinMatchingResponse 银行卡bin信息查询响应
type BankCardBinMatchingResponse struct {
	models.StandardResponse
	// 银行卡信息
	CardInfo *CardInfo `json:"card_info,omitempty"`
}

// CardInfo 银行卡信息
type CardInfo struct {
	// BankCode 银行行号
	BankCode string `json:"bank_code,omitempty"`
	// BankName 银行名称
	BankName string `json:"bank_name,omitempty"`
	// CardType 卡类型
	CardType string `json:"card_type,omitempty"`
	// CardLevel 卡等级
	CardLevel string `json:"card_level,omitempty"`
	// BinCode BIN码
	BinCode string `json:"bin_code,omitempty"`
}
